#include <ArduinoJson.h>

void setup()
{
    Serial.begin(9600);

    // 重点1：DynamicJsonDocument对象
    const size_t capacity = JSON_ARRAY_SIZE(2) + 2 * JSON_OBJECT_SIZE(1) + 60;
    DynamicJsonDocument doc(capacity);

    // 重点2：即将解析的json文件
    String json = "[{\"name\":\"taichi-maker\"},{\"website\":\"www.taichi-maker.com\"}]";

    // 重点3：反序列化数据
    deserializeJson(doc, json);

    String nameStr = doc[0]["name"].as<String>();
    String websiteStr = doc[1]["website"].as<String>();

    // 通过串口监视器输出解析后的数据信息
    Serial.print("nameStr = ");
    Serial.println(nameStr);
    Serial.print("websiteStr = ");
    Serial.println(websiteStr);
}

void loop() {}

/* 
语句讲解

重点1：
DynamicJsonDocument doc(capacity);
与以上示例相同，这里我们建立了DynamicJsonDocument对象，该对象名称为doc。
doc对象的capacity参数用于设置解析JSON所需要的内存大小。
这个空间大小是由语句const size_t capacity = JSON_ARRAY_SIZE(2) + 2*JSON_OBJECT_SIZE(1) + 60;计算出来的。

在这里我们同样回顾一下需要解析的JSON信息内容：

[
  {
    "name": "taichi-maker"
  },
  {
    "website": "www.taichi-maker.com"
  }
]

我们可以看到，以上JSON信息是一个数组，该数组含有两个元素。
因此，我们在计算capacity时首先使用了语句JSON_ARRAY_SIZE(2)来获得含有两个元素的数组所占用内存的大小。

另外，这两个数组元素都是含有一个数据的对象。
因此，我们在计算capacity时使用了语句2*JSON_OBJECT_SIZE(1)。其中JSON_OBJECT_SIZE(1)可以获得含有一个数据的对象大小，我们将它乘以2是因为这里有两个含有一个数据的对象。

在计算capacity的时候，我们还在计算的最后增加60。
这么做是由于ArduinoJson库在解析信息时，需要额外的空间来复制JSON信息。 

*/